#include <QKeyEvent>
#include <QMessageBox>
#include "MainWindow.h"
#include "ui_MainWindow.h"

/**
 * 构造方法。
 * @param parent    父窗口
 */
MainWindow::MainWindow(QWidget* parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    mButtonPauseImage(Const::BUTTON_PAUSE_IMAGE_PATH),
    mButtonPlayMusicImage(Const::BUTTON_MUSIC_PLAY_IMAGE_PATH),
    mButtonResumeImage(Const::BUTTON_RESUME_IMAGE_PATH),
    mButtonStopMusicImage(Const::BUTTON_MUSIC_STOP_IMAGE_PATH),
    mGameBoard(this, Const::GAME_BOARD_X, Const::GAME_BOARD_Y, Const::GAME_BOARD_WIDTH, Const::GAME_BOARD_HEIGHT),
    mPreview(this, Const::PREVIEW_X, Const::PREVIEW_Y, Const::PREVIEW_WIDTH, Const::PREVIEW_HEIGHT),
    mGame(&mGameBoard, mGameBoard.getBitmap(), &mPreview, mPreview.getBitmap()) {
    ui->setupUi(this);

    // 设置背景图片
    QMainWindow::setStyleSheet(Const::IMAGE_PATH);

    // 连接信号与槽
    QMainWindow::connect(&mGame, SIGNAL(UM_DIFFICULTY_UP(int)), SLOT(onDifficultyUp(int)));
    QMainWindow::connect(&mGame, SIGNAL(UM_GAME_OVER(bool)), SLOT(onGameOver(bool)));
    QMainWindow::connect(&mGame, SIGNAL(UM_SCORE(int)), SLOT(onScore(int)));

    // 安装事件过滤器
    QMainWindow::installEventFilter(this);

    // 设置状态栏的格的宽度
    int labelWidth = QMainWindow::width() / Const::STATUS_BAR_PART_COUNT;
    ui->statusBar->addWidget(&mLabelDifficulty, labelWidth);
    ui->statusBar->addWidget(&mLabelScore, labelWidth);

    // 设置状态栏第1格的文字
    this->onDifficultyUp(1);

    // 设置状态栏第2格的文字
    this->onScore(0);

}

/**
 * 析构方法。
 */
MainWindow::~MainWindow() {
    delete ui;
}

/**
 * 事件过滤器。重载这个方法，过滤 WindowDeactivate 事件。
 * 在发生 WindowDeactivate 事件（窗口失去焦点事件）时，游戏暂停。
 * @param e 事件相关信息
 * @return 某个事件在此被处理则返回 true，否则返回 false
 */
bool MainWindow::eventFilter(QObject*, QEvent* e) {
    Game::Status status = mGame.getStatus();
    if (status == Game::PLAYING && e->type() == QEvent::WindowDeactivate) {
        this->on_buttonPause_clicked();
        return true;
    }
    return false;
}

/**
 * 按键事件的响应方法。
 * @param e 事件相关信息
 */
void MainWindow::keyPressEvent(QKeyEvent* e) {
    mGame.onKeyPressed(e->key());
}

/**
 * "播放音乐"按钮的单击响应方法。
 */
void MainWindow::on_buttonMusic_clicked() {
    bool playingMusic = mGame.playMusic();
    if (playingMusic) {
        ui->buttonMusic->setIcon(mButtonStopMusicImage);
    } else {
        ui->buttonMusic->setIcon(mButtonPlayMusicImage);
    }
    QMainWindow::setFocus();
}

/**
 * "暂停"按钮的单击响应方法。
 */
void MainWindow::on_buttonPause_clicked() {
    mGame.pause();
    Game::Status status = mGame.getStatus();
    if (status == Game::PAUSED) {
        ui->buttonPause->setIcon(mButtonResumeImage);
    } else if (status == Game::PLAYING) {
        ui->buttonPause->setIcon(mButtonPauseImage);
    }
    QMainWindow::setFocus();
}

/**
 * "开始"按钮的单击响应方法。
 */
void MainWindow::on_buttonStart_clicked() {
    // 游戏开始
    mGame.start();

    // 设置按钮状态
    ui->buttonPause->setEnabled(true);

    // 设置按钮图片
    ui->buttonPause->setIcon(mButtonPauseImage);

    // 设置状态栏文字
    this->onDifficultyUp(1);
    this->onScore(0);

    QMainWindow::setFocus();
}

/**
 * 难度增加事件的响应方法。
 * @param difficulty    难度
 */
void MainWindow::onDifficultyUp(int difficulty) {
    mLabelDifficulty.setText(tr("IDS_DIFFICULTY") + QString::number(difficulty));
}

/**
 * 游戏结束事件的响应方法。
 * @param isWon  胜利则为 true，否则为 false
 */
void MainWindow::onGameOver(bool isWon) {
    if (isWon) {
        QMessageBox::information(this, " ", tr("IDS_WON"));
    } else {
        QMessageBox::information(this, " ", tr("IDS_LOST"));
    }
    ui->buttonPause->setEnabled(false);
}

/**
 * 得分事件的响应方法。
 * @param score 得分
 */
void MainWindow::onScore(int score) {
    mLabelScore.setText(tr("IDS_SCORE") + QString::number(score));
}
